package main.java.juego;

import java.util.*;

import main.java.tipos.CartaAlemania;
import main.java.tipos.CartaAliados;


public class TurnoImpl implements Turno{
	
	/**
	 * @uml.property  name="cartasAlemanasEnJuego" multiplicity="(0 -1)"
	 */
	private List<CartaAlemania> cartasAlemanasEnJuego;
	/**
	 * @uml.property  name="cartasAliadasEnJuego" multiplicity="(0 -1)"
	 */
	private List<CartaAliados> cartasAliadasEnJuego;
	/**
	 * @uml.property  name="partidaActual"
	 * @uml.associationEnd  readOnly="true"
	 */
	private Baraja partidaActual;
	/**
	 * @uml.property  name="numeroDeTurno"
	 */
	private static int numeroDeTurnos=0;
	
	private TurnoImpl (Baraja partida){
		numeroDeTurnos++;
		partidaActual = partida;
		cartasAlemanasEnJuego = new ArrayList<CartaAlemania>();
		cartasAliadasEnJuego = new ArrayList<CartaAliados>();
		
	}
	
	public static TurnoImpl create(Baraja partida){
		return new TurnoImpl(partida);
	}

	
	
	@Override
	public List<CartaAlemania> dameCartasAlemanasEnJuego() {
		// TODO Auto-generated method stub
		return cartasAlemanasEnJuego;
	}
	@Override
	public List<CartaAliados> dameCartasAliadasEnJuego() {
		// TODO Auto-generated method stub
		return cartasAliadasEnJuego;
	}
	@Override
	public int dameFuerzaTotalAliados() {
		// TODO Auto-generated method stub
		int fuerza=0;
		for(CartaAliados c:cartasAliadasEnJuego){
			fuerza+=c.dameFuerza();
		}
		return fuerza;
	}
	@Override
	public int damefuerzaTotalAlemania() {
		// TODO Auto-generated method stub
		int fuerza=0;
		for(CartaAlemania c:cartasAlemanasEnJuego){
			fuerza+=c.dameFuerza();
		}
		return fuerza;
	}

	@Override
	public int dameNumeroDeTurnos() {
		// TODO Auto-generated method stub
		return numeroDeTurnos;
	}
	
	@Override
	public void reemplazaCartasLiderazgo(CartaAlemania carta) {
		cartasAlemanasEnJuego.remove(carta);
		insertarCartaAlemana();
		insertarCartaAlemana();
	}

	@Override
	public void obtenerCartasAlemania() {
		//Repartimos  cartas de Alemania
		for(int i=0;i<7;i++){
			insertarCartaAlemana();
		}
	}

	@Override
	public void obtenerCartasAliadas() {
		//Repartimos  cartas de los aliados
		for(int i=0;i<4;i++){
			insertaCartaAliada();
		}		
	}
	
	//Intecambia una carta alemana que está en juego por otra del mazo principal
	public void intercambiaCartaAlemana(CartaAlemania carta){
		cartasAlemanasEnJuego.remove(carta);
		insertarCartaAlemana();
	}
	
	//Devuelve las cartas con las que se está jugando en el turno
	public void descartarCartaAlemana(CartaAlemania carta){
		cartasAlemanasEnJuego.remove(carta);
	}
	
	//Devuelve la carta que ocupa la posición índice
	public CartaAlemania dameCartaPorIndice(Integer indice){
		return cartasAlemanasEnJuego.get(indice);
	}
	
	
	//Inserta una carta del mazo principal
	private void insertarCartaAlemana(){
		CartaAlemania cartaParaJugar = partidaActual.reparteAlemana();
		cartasAlemanasEnJuego.add(cartaParaJugar);
	}
	
	//Inserta una carta del mazo principal
	private void insertaCartaAliada(){
		CartaAliados cartaParaJuar = partidaActual.reparteAliada();
		cartasAliadasEnJuego.add(cartaParaJuar);
	}

	//Añade un retraso a la partida
	public void anadeRetrasoPartida() {
		partidaActual.anadeRetraso();
		partidaActual.vuelveInsertar(cartasAliadasEnJuego);
	}
	
}
